﻿using System;

namespace Lesson8_静态类和静态构造函数
{
    #region 一 静态类
    //概念
    //用static修饰的类

    //特点
    //只能包含静态成员
    //不能被实例化

    //作用
    //1.将常用的静态成员写在静态类中 方便实用
    //2.静态类不能被实例化 更能体现工具类的 唯一性
    //比如 Console就是一个静态类
    static class TestStatic
    {
        static public int testIndex = 0;
        static public int TestIndex
        {
            get; set;
        }
        static public void TestFun()
        {
            Console.WriteLine("Test");
        }
    }
    #endregion

    #region 二 静态构造函数
    //概念
    //static修饰的构造函数

    //特点
    //1.静态类和普通类都可以使用
    //2.不能使用访问修饰符(因为静态构造函数是自动进行调用的)
    //3.不能传入参数
    //4.只会自动调用一次

    //作用：在静态构造函数中初始化 静态变量

    //1.静态类中的静态构造函数
    static class StaticClass
    {
        static public int testIndex1 = 10;
        static public int testIndex2 = 20;
        static public int testIndex3 = 30;
        static public int TestIndex3
        {
            get
            {
                return testIndex3;
            }
        }

        static StaticClass()
        {
            Console.WriteLine("静态构造函数");
            testIndex1 = 100;
            testIndex2 = 200;
        }

        static public void TestFun()
        {
            Console.WriteLine("123456");
        }
    }

    //普通类中的静态构造函数
    class Class
    {
        public int testIndex1 = 100;
        public int testIndex2 = 200;
        public int testIndex3 = 300;

        public int TestIndex3
        {
            get
            {
                return testIndex3;
            }
        }
        static Class()
        {
            Console.WriteLine("静态构造函数");
        }

        //普通类中 静态构造函数与普通构造函数不冲突 也不属于重载
        public Class()
        {
            Console.WriteLine("普通构造函数");
        }
    }
    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            StaticClass.TestFun();
            Console.WriteLine(StaticClass.testIndex1);
            Console.WriteLine(StaticClass.testIndex2);
            Console.WriteLine(StaticClass.TestIndex3);
            //可以看出在我们访问类中内容时 静态构造函数会先被自动调用

            Class c1 = new Class();
            //调用普通构造函数时 会先调用静态构造函数
        }
    }
}